package main

import "fmt"

type Animal struct {
	Name string
}

func (a Animal) Call() string {
	return "动物的叫声..."
}

func (a Animal) GetName() string {
	return a.Name
}

type Pet struct {
	Name string
}

//注意 Pet和Dog ，都有同名方法
func (p Pet) GetName() string {
	return p.Name
}

//可以理解为 Dog这个类，同时继承了Animal和Pet
type Dog struct {
	Animal
	Pet
}

func main() {
	animal := Animal{"中华田园犬"}
	pet := Pet{"宠物狗"}
	dog := Dog{animal, pet}
	fmt.Println(pet.GetName())
	//fmt.Println(dog.GetName()) //会报错，因为Animal和pet，都实现了GetName方法，dog不知道该调哪一个
	fmt.Println(dog.Animal.GetName())
	fmt.Println(dog.Pet.GetName())
	fmt.Println(dog.Call()) //不会报错，因为只有Animal实现了Call方法，这里的Call没有重名，也就没有歧义
}
